/**
 * 队列任务模块
 */

package main

// 添加队列查询任务（写上对应的函数名字）
func AddQueryTask(funcName string) {
    Queue.PushUnique(funcName)
}

// 执行队列查询任务（例：新开仓或平仓后需要 查询持仓、查询资金）频率不能低于1秒，否则会触发交易所频繁查询导致查询失败。
func RunQueryTask() {

    for {
        // 每次只处理一个任务
        task := Queue.Poll()
        if task != nil {

            switch task {

                // 查询资金账户
                case "ReqQryTradingAccount":
                    iResult := TradeSpi.ReqQryTradingAccount()

                    // iResult 不等于0，则表示查询失败了，重新加入到队列中
                    if iResult != 0 {
                        Queue.PushUnique("ReqQryTradingAccount")
                    }

                // 查询持仓
                case "ReqQryPosition":
                    iResult := TradeSpi.ReqQryPosition()
                    if iResult != 0 {
                        Queue.PushUnique("ReqQryPosition")
                    }
            }
        }

        Sleep(1000)
    }
}

// 启动报单有效期任务（报单有时效，到期进行撤单）
func RunOrderInsertTask() {
    for {

        mOrderInsertTask := MapOrderTask.GetAll()
        for k, v := range mOrderInsertTask {
            val := v.(OrderStruct)

            if val.Second <= 0 && Ctp.IsTradeInitFinish {
                TradeSpi.OrderCancel(val.OrderSysID)
                MapOrderTask.Del(k)

            } else {
                val.Second -= 1
                MapOrderTask.Set(k, val)
            }
        }

        Sleep(1000)
    }
}